-- 运营活动: 达标竞技


--[[
{
    cmd_id = 1, -- 命令id，用于批量停止、删除活动 
    act_id = 93, -- 活动id (93 新连续累充)
    act_name = "新连续累充", -- 活动名称
    act_desc = "活动结束时根据魂石值及充值排名领取丰厚奖励！", -- 活动描述
    beg_time = 1513958400,  -- 活动开始时间(unix timestamp)
    end_time = 1594044800,  -- 活动结束时间(unix timestamp)
    config = -- 配置数据
    {
        Rewards = 
        {
            {
                Gold = 1980,     --消耗元宝
                Awards = 
                {
                    {       --第一档奖励
                        {type = 0, id = 514, count = 1, bind = 1 ,},
                        {type = 0, id = 518, count = 1, bind = 1 ,},
                        {type = 0, id = 558, count = 2, bind = 1 ,},
                        {type = 0, id = 563, count = 2, bind = 1 ,},
                    },
                    {       --第二档奖励
                        {type = 0, id = 514, count = 1, bind = 1 ,},
                        {type = 0, id = 518, count = 1, bind = 1 ,},
                        {type = 0, id = 558, count = 3, bind = 1 ,},
                        {type = 0, id = 563, count = 3, bind = 1 ,},
                    },
                    {       --第三档奖励
                        {type = 0, id = 514, count = 1, bind = 1 ,},
                        {type = 0, id = 518, count = 1, bind = 1 ,},
                        {type = 0, id = 558, count = 4, bind = 1 ,},
                        {type = 0, id = 563, count = 4, bind = 1 ,},
                    },
                },
            },
            {
                Gold = 1980,     --消耗元宝
                Awards = 
                {
                    {       --第一档奖励
                        {type = 0, id = 514, count = 1, bind = 1 ,},
                        {type = 0, id = 518, count = 1, bind = 1 ,},
                        {type = 0, id = 558, count = 2, bind = 1 ,},
                        {type = 0, id = 563, count = 2, bind = 1 ,},
                    },
                    {       --第二档奖励
                        {type = 0, id = 514, count = 1, bind = 1 ,},
                        {type = 0, id = 518, count = 1, bind = 1 ,},
                        {type = 0, id = 558, count = 3, bind = 1 ,},
                        {type = 0, id = 563, count = 3, bind = 1 ,},
                    },
                    {       --第三档奖励
                        {type = 0, id = 514, count = 1, bind = 1 ,},
                        {type = 0, id = 518, count = 1, bind = 1 ,},
                        {type = 0, id = 558, count = 4, bind = 1 ,},
                        {type = 0, id = 563, count = 4, bind = 1 ,},
                    },
                },
            },
        },
    },
}
]]

-- 检查配置是否正确，正确则返回 0，否则返回错误码
function oper_act_93_check_cfg(cfg)
    if cfg == nil then return 20 end
    
    local config = cfg.config
    if config == nil then return 21 end
    
    if config.Rewards == nil then return 23 end
    if type(config.Rewards) ~= "table" then return 24 end
    for idx = 1, #config.Rewards do
        local dayRewards = config.Rewards[idx]
        if dayRewards == nil then return 25 end
        if type(dayRewards) ~= "table" then return 26 end
        if dayRewards.Awards == nil then return 27 end
        if type(dayRewards.Awards) ~= "table" then return 28 end
        for ii = 1, #dayRewards.Awards do
            if not oper_act_check_one_award_cfg(dayRewards.Awards[ii]) then
                return 22
            end 
        end
    end

    return 0
end

-- 安装活动，成功则返回 0，否则返回错误码
function oper_act_93_setup(cfg)  
    return 0
end

-- 卸载活动
function oper_act_93_unsetup(cfg)    
end

-- 活动开始
function oper_act_93_start(cfg)
    local ssVar = System.getStaticVar()
    ssVar.oper_act_93_start = 1
    ssVar.oper_act_93_cmd = cfg.cmd_id
    ssVar.oper_act_93_act = cfg.act_id

    local data = gRankMgr_GetValueByIndx(0, RANK_DEFINE_OPERATION_93, 1)

    if data then
        local myData = BaseFuc_unserialize(data)
        if myData and myData.cmd_id and myData.cmd_id == cfg.cmd_id and myData.act_id and myData.act_id == cfg.act_id and
            myData.time and cfg.beg_time <= myData.time and  cfg.end_time > myData.time then
            return
        end
    end

    gRankMgr_Clear(RANK_DEFINE_OPERATION_93)
end

-- 活动结束
function oper_act_93_end(cfg)
    local ssVar = System.getStaticVar()
    ssVar.oper_act_93_start = nil
    ssVar.oper_act_93_cmd = nil
    ssVar.oper_act_93_act = nil

    if not cfg then return end
    local config = cfg.config
    if not config then return end

    local rankPtr = Ranking.getRanking(RankList[RANK_DEFINE_OPERATION_93].strName)
    local rankCount = Ranking.getRankItemCount(rankPtr)
    for idx = 1, rankCount do
        local item = Ranking.getItemFromIndex(rankPtr, idx-1)
        if item then
            local actorid = tonumber(Ranking.getId(item))
            local data = Ranking.getSub(item, 1)
            local dataTable
            if not data or data == "" then
                dataTable = {}
            else
                dataTable = BaseFuc_unserialize(data)
            end
          
            if dataTable.myDayData then
                local rewardCfg = config.Rewards
                for idx = 1, #rewardCfg do
                    if dataTable.myDayData[idx] then
                        for ii = 1, #rewardCfg[idx].Awards do
                            if dataTable.myDayData[idx][ii] and dataTable.myDayData[idx][ii] == 1 then
                                local rewards = rewardCfg[idx].Awards[ii]
                                local title = Lang.ScriptTips.Operation234
                                local content = Lang.ScriptTips.Operation235
                                Awards.GiveToMailById(actorid, rewards, title, content, LogIds.OperationLogId093, Lang.LogTips.Operation093, dataTable.vocation, dataTable.sex)
                            end
                        end
                    end
                end
            end
        end
    end
end

-- 打包数据
function oper_act_93_packet_data(sysarg, cfg)

    local ssVar = System.getStaticVar()
    if not ssVar.oper_act_93_start then
        return
    end
    if not cfg then return end
    local config = cfg.config
    if not config then return end

    local actorid = Actor.getActorId(sysarg)
    local data = gRankMgr_GetValueById(actorid, RANK_DEFINE_OPERATION_93, 1)

    local myData = BaseFuc_unserialize(data)
    

    if not myData then
        myData = {}
    end

    if not myData.myDayData then
        myData.myDayData = {}
    end

    local time = System.getSystemTime()
    if myData.mySelfTime and not System.isUnixTimeSameDay(myData.mySelfTime, time) then
        myData.myGold = 0
    end
    if not myData.myGold then
        myData.myGold = 0
    end

    if not myData.myDays then
        myData.myDays = {}
    end


    local pack = oper_act_alloc_init_data_packet(sysarg, cfg.cmd_id, cfg.act_id)
    if (pack == nil) then
        return
    end
    DataPack.writeUInt(pack, myData.myGold or 0)
    local rewardCfg = config.Rewards
    DataPack.writeByte(pack, #rewardCfg)
    for idx = 1, #rewardCfg do
        if not myData.myDayData[idx] then
            myData.myDayData[idx] = {}
        end
        DataPack.writeByte(pack, myData.myDays[idx] or 0)
        DataPack.writeByte(pack, #rewardCfg[idx].Awards)
        for ii = 1, #rewardCfg[idx].Awards do
            DataPack.writeByte(pack, myData.myDayData[idx][ii] or 0)
        end
    end
    DataPack.flush(pack)
    
    --DataPack.writeByte(netPack, 1)        -- 活动特有参数
end

-- 操作，返回操作结果，0为成功
function oper_act_93_do(sysarg, cfg, clientPkt)
    if cfg == nil then return end
    
    if cfg.state == nil or cfg.state ~= 1 then -- 不在活动中
        Actor.sendTipmsg(sysarg,Lang.ScriptTips.Operation001, ttFlyTip)
        return
    end
    
    local config = cfg.config
    if config == nil then -- 参数错误
        print("error, oper_act_93_do cfg.config confg error")
        return
    end

    local Page = DataPack.readByte(clientPkt)
    local Index = DataPack.readByte(clientPkt)
    
    local ssVar = System.getStaticVar()
    if not ssVar.oper_act_93_start then
        Actor.sendTipmsg(sysarg, Lang.ScriptTips.Operation004, ttFlyTip)
        return
    end
   
    if Page > #config.Rewards then
        Actor.sendTipmsg(sysarg, Lang.ScriptTips.Operation005, ttFlyTip)
        return
    end

    if Index > #config.Rewards[Page].Awards then
        Actor.sendTipmsg(sysarg, Lang.ScriptTips.Operation005, ttFlyTip)
        return
    end

    local actorid = Actor.getActorId(sysarg)
    local data = gRankMgr_GetValueById(actorid, RANK_DEFINE_OPERATION_93, 1)
    local myData = BaseFuc_unserialize(data)

    if not myData then
        Actor.sendTipmsg(sysarg, Lang.ScriptTips.Operation006, ttFlyTip)
        return
    end
    if not myData.myDayData then
        Actor.sendTipmsg(sysarg, Lang.ScriptTips.Operation006, ttFlyTip)
        return
    end
    if not myData.myDayData[Page] or not myData.myDayData[Page][Index] or myData.myDayData[Page][Index] ~= 1 then
        Actor.sendTipmsg(sysarg, Lang.ScriptTips.Operation006, ttFlyTip)
        return
    end

    local rewardCfg = config.Rewards

    local rewards = rewardCfg[Page]
    if not rewards then
        return
    end

    local newReward = rewards.Awards[Index]
    if not newReward then
        return
    end

    myData.myDayData[Page][Index] = 2
    
    if IsBagGridEnough(sysarg, newReward) then
        GiveCommonAward(sysarg, newReward, LogIds.OperationLogId093, Lang.LogTips.Operation093)
    else
        local actorId = Actor.getActorId(sysarg)
        local title = Lang.ScriptTips.Operation234
        local content = Lang.ScriptTips.Operation235
        local sex = Actor.getIntProperty(sysarg, PROP_ACTOR_SEX)
        local vocation = Actor.getIntProperty(sysarg, PROP_ACTOR_VOCATION)
        Awards.GiveToMailById(actorId, newReward, title, content, LogIds.OperationLogId093, Lang.LogTips.Operation093, vocation, sex)
    end

    if not myData.cmd_id then
        myData.cmd_id = cfg.cmd_id
        myData.act_id = cfg.act_id
        myData.time = System.getSystemTime()
    end

    if not myData.sex then
        myData.sex = Actor.getIntProperty(sysarg, PROP_ACTOR_SEX)
        myData.vocation = Actor.getIntProperty(sysarg, PROP_ACTOR_VOCATION)
    end

    local newData = BaseFuc_serialize(myData)
    gRankMgr_SetRankEx(actorid, RANK_DEFINE_OPERATION_93, 1, newData)
        
    local netPack = oper_act_alloc_do_result_packet(sysarg, cfg.cmd_id, cfg.act_id, 0)
    if not netPack then return end

    DataPack.writeByte(netPack, Page) 
    DataPack.writeByte(netPack, Index) 
    DataPack.writeByte(netPack, 2) 

--  DataPack.writeByte(netPack, 1) -- 活动特有参数
    DataPack.flush(netPack)
end

--[[
-- 跨天
function oper_act_93_new_day_arrive(act_id)  
    
end
]]

--累计充值元宝
function oper_act_93_withdrawyuanbao(sysarg, Gold)
    local ssVar = System.getStaticVar()
    if not ssVar.oper_act_93_start then
        return
    end
    if not ssVar.oper_act_93_cmd then
        return
    end
    if not ssVar.oper_act_93_act then
        return
    end
    
    local cfg = get_oper_act_cfg(ssVar.oper_act_93_cmd, ssVar.oper_act_93_act)
    if not cfg then
        return
    end

    local config = cfg.config
    if not config then
        return
    end 

    local actorid = Actor.getActorId(sysarg)
    local data = gRankMgr_GetValueById(actorid, RANK_DEFINE_OPERATION_93, 1)

    local myData = BaseFuc_unserialize(data)

    if not myData then
        myData = {}
    end
    if not myData.myDays then
        myData.myDays = {}
    end
    local time = System.getSystemTime()
    if myData.mySelfTime and not System.isUnixTimeSameDay(myData.mySelfTime, time) then
        myData.myGold = 0
    end
    if not myData.myGold then
        myData.myGold = 0
    end
    if not myData.myDayData then
        myData.myDayData = {}
    end
    local myOldGold = myData.myGold
    myData.myGold = myData.myGold + Gold
    for idx = 1, #config.Rewards do
        if not myData.myDays[idx] then
            myData.myDays[idx] = 0
        end
        if myOldGold < config.Rewards[idx].Gold and myData.myGold >= config.Rewards[idx].Gold then
            myData.myDays[idx] = myData.myDays[idx] + 1
            if not myData.myDayData[idx] then
                myData.myDayData[idx] = {}
            end
            for ii = 1, #config.Rewards[idx].Awards do
                if myData.myDayData[idx][ii] and myData.myDayData[idx][ii] >= 1 then
                else
                    if config.Rewards[idx].Days[ii] <= myData.myDays[idx] then
                        myData.myDayData[idx][ii] = 1
                    end
                end
            end
        end
    end

    if not myData.cmd_id then
        myData.cmd_id = cfg.cmd_id
        myData.act_id = cfg.act_id
        myData.time = time
    end

    if not myData.sex then
        myData.sex = Actor.getIntProperty(sysarg, PROP_ACTOR_SEX)
        myData.vocation = Actor.getIntProperty(sysarg, PROP_ACTOR_VOCATION)
    end

    myData.mySelfTime = time

    local newData = BaseFuc_serialize(myData)
    gRankMgr_SetRankEx(actorid, RANK_DEFINE_OPERATION_93, 1, newData)
    oper_act_93_packet_data(sysarg, cfg)
end

